package org.subatu.orm.query.base;


import org.subatu.orm.query.table.CondColumn;

import java.util.List;
import java.util.Map;

/**
 * sql 片段 所有父类
 */
public interface BaseSql {

    SqlData sqlData();

    // where 和 join 的 别名记录: key为表名, value为别名
    // Map<String, String> tableAliasMap = new HashMap<>();

    // 查询 部分
    // List<QueryColumn> selectList = new ArrayList<>();

    // from 部分
    // List<TableDef> fromTable = new ArrayList<>();

    // 连接部分 (含条件)
    // List<TableDef> joinList = new ArrayList<>();

    // 标志位: 0 join ; 1 where ; 2 having
    // Flag isWhere = Flag.newFlag(0);
    // 查询条件
    // List<CondColumn> whereList = new ArrayList<>();

    // group by 条件
    // List<QueryColumn> groupByList = new ArrayList<>();

    // 聚合列
    // List<CondColumn> havingList = new ArrayList<>();

    // order By 条件
    // Map<QueryColumn, OrderEnum> orderByList = new LinkedHashMap<>();

    // 最终的参数值列表
    // List<Object> valueList = new ArrayList<>();
    // 最后补充的 sql
    // StringBuilder lastSql = new StringBuilder();

    // 各部分 编译sql
    SqlStruct buildSql();

    // 过滤 条件集合sql
    static String filterCondSql(String whereSql) {
        if (whereSql.startsWith("and ")) {
            whereSql = whereSql.substring(4);
        }
        if (whereSql.startsWith("or ")) {
            whereSql = whereSql.substring(3);
        }
        whereSql = whereSql.replace("where or", "where");
        whereSql = whereSql.replace("( and", "(");
        whereSql = whereSql.replace("( or", "(");
        whereSql = whereSql.replace("and and", "and");
        whereSql = whereSql.replace("and or", "and");
        whereSql = whereSql.replace("or and", "or");
        whereSql = whereSql.replace("or or", "or");
        return whereSql;
    }

    default String getAllCondSql(List<CondColumn> condColumnList) {
        String allCondSql = "";
        for (CondColumn condColumn : condColumnList) {
            String sql = condColumn.buildCondSql(this.sqlData().tableAliasMap, sqlData().valueList);
            allCondSql += sql;
        }
        // 过滤 条件sql
        allCondSql = filterCondSql(allCondSql);
        return allCondSql;
    }

    // 拼接 最后的sql
    default BaseSql last(String sql) {
        sqlData().lastSql.append(sql);
        return this;
    }

    List<Map<String, Object>> list();

    <T> List<T> list(Class<T> resultType);

    <T> T one(Class<T> resultType);

    <T> T one(Class<T> clazz, boolean strict);
}
